CC = gcc
AS = as
LD = ld
OBJCOPY = objcopy
CAT = cat
RM = rm
CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer

BOOT_DIR = boot/
PROCESS_DIR = process/
MEMORY_DIR = mm/

kernel: system
	$(OBJCOPY) -O binary -j .text system kernel

system: $(BOOT_DIR)boot.o $(BOOT_DIR)main.o $(PROCESS_DIR)interrupt.o $(PROCESS_DIR)schedule.o $(MEMORY_DIR)memory.o
	$(LD) -Ttext 0x7c00 -s -o system $(BOOT_DIR)boot.o $(BOOT_DIR)main.o $(PROCESS_DIR)interrupt.o $(PROCESS_DIR)schedule.o $(MEMORY_DIR)memory.o

$(BOOT_DIR)boot.o: $(BOOT_DIR)boot.s
	$(AS) -a $(BOOT_DIR)boot.s -o $(BOOT_DIR)boot.o
	   
$(BOOT_DIR)main.o: $(BOOT_DIR)main.c
	$(CC) -c $(BOOT_DIR)main.c -o $(BOOT_DIR)main.o
	
$(PROCESS_DIR)interrupt.o: $(PROCESS_DIR)interrupt.c
	$(CC) -c $(PROCESS_DIR)interrupt.c -o $(PROCESS_DIR)interrupt.o

$(PROCESS_DIR)schedule.o: $(PROCESS_DIR)schedule.c
	$(CC) -c $(PROCESS_DIR)schedule.c -o $(PROCESS_DIR)schedule.o

$(MEMORY_DIR)memory.o: $(MEMORY_DIR)memory.c
	$(CC) -c $(MEMORY_DIR)memory.c -o $(MEMORY_DIR)memory.o

clean:
	$(RM) -rf $(BOOT_DIR)boot.o
	$(RM) -rf $(BOOT_DIR)main.o
	$(RM) -rf $(PROCESS_DIR)interrupt.o
	$(RM) -rf $(PROCESS_DIR)schedule.o
	$(RM) -rf $(MEMORY_DIR)memory.o
	$(RM) -rf system
	$(RM) -rf kernel

